package demo.maven.bean.singleton;

/**
 * 这种方式是最基本的实现方式，这种实现最大的问题就是不支持多线程。因为没有加锁 synchronized，所以严格意义上它并不算单例模式。
 * 这种方式 lazy loading 很明显，不要求线程安全，在多线程不能正常工作。
 * @author peter
 * @date 2021/12/5 下午4:25
 */
public class Singleton4 {
    // 当一个共享变量被volatile修饰时，
    // 1. 添加了内存屏障，它会保证修改的值会立即被更新到主存，当有其他线程需要读取时，它会去内存中读取新值。
    // 2. 禁止了指令重排序，程序不会奔溃
    // 3. volatile 不保证原子性，但是synchronized
    private volatile static  Singleton4 instance;
    private Singleton4(){}

    public static Singleton4 getInstance() {
        if (instance == null) {
            synchronized (Singleton4.class) {
                if (instance == null) {
                    instance = new Singleton4();
                }
            }
        }
        return instance;
    }
}
